﻿using System.ComponentModel;
using System.Windows.Forms;

namespace Activity.II
{
	public partial class Window : Form
	{
		/// <summary>
		/// Источник данных об активных игроках.
		/// </summary>
		public BindingSource playersData = new BindingSource();

		/// <summary>
		/// Список активных серверов.
		/// </summary>
		public BindingList<Computer> servers = new BindingList<Computer>();

		/// <summary>
		/// Стандартный конструктор.
		/// </summary>
		public Window ()
		{
			InitializeComponent();

			servers.Add(CreatePC("ПК", "HOME-PC"));
			servers.Add(CreateMainframe("Мейнфрейм", "IBM"));

			// Устанавливаем связи
			boxServers.DataSource = servers;
			boxPlayers.DataSource = playersData;
		}

		/// <summary>
		/// Создать новый экземпляр ПК.
		/// </summary>
		public virtual PC CreatePC(string name ,string description)
		{
			return new PC(name){Description = description};
		}

		/// <summary>
		/// Создать новый экземпляр мейнфрейма.
		/// </summary>
		public virtual Mainframe CreateMainframe(string name, string description)
		{
			return new Mainframe(name){Description =  description};
		}

		/// <summary>
		/// Отклик на нажатие кнопки создания нового ПК сервера.
		/// </summary>
		private void OnCreatePC (object sender, System.EventArgs e)
		{
			var name = txtNewServerName.Text;
			if (string.IsNullOrEmpty(name)) return;
			servers.Add(new PC(name));
			txtNewServerName.Text = string.Format("Сервер{0}", servers.Count + 1);
		}

		/// <summary>
		/// Отклик на нажатие кнопки создания нового Мейнфрейм сервера.
		/// </summary>
		private void OnCreateMainframe (object sender, MouseEventArgs e)
		{
			var name = txtNewServerName.Text;
			if (string.IsNullOrEmpty(name)) return;
			servers.Add(new Mainframe(name));
			txtNewServerName.Text = string.Format("Сервер{0}", servers.Count + 1);
		}

		/// <summary>
		/// Отклик на изменение текста в описании сервера.
		/// </summary>
		private void OnDescriptionTextChanged (object sender, System.EventArgs e)
		{
			// Обновляем описание компьютера
			var computer = (Computer)boxServers.SelectedItem;
			computer.Description = txtDescription.Text;
		}

		/// <summary>
		/// Отклик на изменение выбранного игрока.
		/// </summary>
		private void OnPlayerSelected (object sender, System.EventArgs e) {}

		/// <summary>
		/// Отклик на изменение выбранного сервера.
		/// </summary>
		private void OnServerSelected (object sender, System.EventArgs e)
		{
			var computer = (Computer)boxServers.SelectedItem;
			// Обновляем текстовые поля
			txtActiveServer.Text = computer.Name;
			txtDescription.Text = computer.Description;
			// Устанавливаем связь с новым списком
			playersData.DataSource = computer.Players;
			// Обновить данные
			UpdateData(computer);
		}

		/// <summary>
		/// Отклик на нажатие кнопки отключения от сервера.
		/// </summary>
		private void OnDisconnect (object sender, System.EventArgs e)
		{
			var computer = (Computer)boxServers.SelectedItem;
			// Отключаем выбранного игрока
			computer.Disconnect((string)boxPlayers.SelectedItem);
			// Обновить данные
			UpdateData(computer);
		}

		/// <summary>
		/// Отклик на нажатие кнопки подключения к серверу.
		/// </summary>
		private void OnConnect (object sender, System.EventArgs e)
		{
			var computer = (Computer)boxServers.SelectedItem;
			// Подключаем игрока
			computer.Connect(txtNewPlayer.Text);
			// Обновить данные
			UpdateData(computer);
			// Генерируем новое имя
			txtNewPlayer.Text = string.Format("Player{0}", computer.Players.Count + 1);
		}

		/// <summary>
		/// Обновить часто изменяемые данные.
		/// </summary>
		private void UpdateData (Computer computer)
		{
			// Обновить системные сведения и лог 
			txtLog.Text = computer.History;
			txtSystemInfo.Text = computer.ToString();
			// обновить список игроков
			playersData.ResetBindings(false);
		}
	}
}
